#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

extern FILE* stdout;

// int main()
// {
//       //系统接口实现重定向
//     close(0);
//     int fd = open("log.txt",O_RDONLY|O_CREAT); //从键盘是读取所以以读取方式打开文件
//     close(1);
//     fd = open("log.txt",O_WRONLY|O_APPEND); //向显示器输入是写入
//     char line[1024]= {0};
//     scanf("%s",line);
//     printf("%s\n",line);
// }

// int main()
// {
    //这里文件全部都能正常打开，暂时不做判断

    // close(0);
    // open("login.txt",O_RDONLY|O_CREAT); //重定向输入文件
    // close(1);
    // open("logout.txt",O_WRONLY|O_CREAT|O_APPEND); //重定向输出文件
    // close(2);
    // open("logerr.txt",O_WRONLY|O_CREAT|O_APPEND); //重定向错误输出文件

    //dup系统接口实现重定向
//     dup2(open("login.txt",O_RDONLY|O_CREAT),0);
//     dup2(open("logout.txt",O_WRONLY|O_CREAT|O_APPEND),1);
//     dup2(open("logerr.txt",O_WRONLY|O_CREAT|O_APPEND),2);


//     char line[1024] = {0};
//     scanf("%s",line);
//     printf(line);
//     perror("is perror");

//     fprintf(stdout,"%s\n","C->stdout:程序的输出");
//     fprintf(stderr,"%s\n","C->stderr:程序的异常");

//     return 0;
// }

int main()
{
    const char* str = "I Love Linux System!\n";
    fprintf(stdout,"fprintf\n");
    write(1,str,strlen(str)); //系统接口中没有\0的概念所以不需要+1写入\0

    //显示器(stdout是行刷新遇到\n时就刷新，但是重定向到文件就是全刷新，当缓冲区写满才刷新)
    //当重定向为文件且调用fork之后，缓冲区没有写满不会刷新到文件
    //程序继续运行父子进程即将结束需要刷新缓冲区，此时谁先刷新谁就会发生写时拷贝
    //缓冲区的fprintf就会变成两个父子进程会同时写入重定向的文件中
    fork();
    //这里调用fork之后
    return 0;
}
